package com.example.demo.controller;

import com.example.demo.pojo.ValidatorPojo;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
public class ValidateTestController {
    /***
     * 解析验证参数错误
     * @param vp —— 需要验证的POJO，使用注解@Valid 表示验证
     * @param errors  错误信息，它由Spring MVC通过验证POJO后自动填充
     * @return 错误信息Map
     */
    //奔注:
    //  这个其实使用到了Spring validation验证框架
    //  这个验证框架会将异常封装到Errors里并作为参数传进方法以供处理
    //  如下,如果出现参数类型不符合的异常,则其中的Key是抛异常的字段,Value是异常的信息
    //                                  例如"email": "邮箱格式错误"
    @RequestMapping(value = "/valid/validate")
    @ResponseBody
    public Map<String, Object> validate(
            @Valid() @RequestBody ValidatorPojo vp, Errors errors) {
        Map<String, Object> errMap = new HashMap<>();
        // 获取错误列表
        List<ObjectError> oes = errors.getAllErrors();
        for (ObjectError oe : oes) {
            String key = null;
            String msg = null;
            // 字段错误
            if (oe instanceof FieldError) {
                FieldError fe = (FieldError) oe;
                key = fe.getField();// 获取错误验证字段名
            } else {
                // 非字段错误
                key = oe.getObjectName();// 获取验证对象名称
            }
            // 错误信息
            msg = oe.getDefaultMessage();
            errMap.put(key, msg);
        }
        return errMap;
    }

    //下面就用了一下springframework.validation框架带的BindingResult类
    //                          其实跟上面大同小异
    @RequestMapping(value="/update" ,method = {RequestMethod.GET,RequestMethod.POST})
    @ResponseBody
    public Object update(@Valid ValidatorPojo vp, BindingResult bindingResult){
        Map result = new HashMap<String,Object>();
        if(bindingResult.hasErrors()){
            String errMsg = bindingResult.getFieldErrors().stream().map(e ->e.getDefaultMessage()).collect(Collectors.joining("<br/>"));
            result.put("出错",errMsg);
            return result;
        }else{
               return "success";
        }
    }

}
